現在每次啟動專案,預設路徑都會是/,但我們目前沒有Component套用這個路由,要自己切換到Post實在有些麻煩,另外Menu的圖案也跟名稱不符,我們來調整一下。
我們先來改icon,由於font-awesome目前已用會員制,必須登入才能產生一套免費的icon集合,因此筆者使用bootstrap的icon。首先去bootstrap的icon頁面下載zip檔(不想下載檔案的人可以直接引用CDN),將檔案解壓縮放在wwwroot
,於_Host.cshtml
引用bootstrap-icons.css
,在官網搜尋自己喜歡的icon套用即可,筆者這邊還有做些樣式調整。
接著在Blazor Server點擊右鍵選擇屬性,切換偵錯頁簽並在紅框處輸入Post,如果是偏好在文件輸入的人,也可以打開Properties
下的launchSettings.json
檔案,於profiles
內的IIS Express
輸入這行"launchUrl": "Post",
,兩者是一樣的結果。
Day06有說到綁定,不過只有稍微帶過,因為當時的目的只是展示form
,現在來細說一下。
Blazor的資料綁定有分為單向綁定(one way binding)跟雙向綁定(two way binding),單向綁定就是在畫面上輸入@variable
,有什麼資料就顯示什麼。
雙向綁定則要用@bind-value
將input內的資料跟畫面綁在一起,畫面輸入的內容也會反向影響資料。
如果有學過Angular的人應該會很熟悉,就是[ngModel]跟[(ngModel)]的用途,只是名字換了一個。
那Blazor有像Angular的(click)事件綁定嗎?也是有的,不過若用<InputText>
Component會說到較為複雜如EventCallBack的內容,所以筆者這邊先用單純的<input>
元素,之後講到EventCallBack再回來說明。
先把<InputText>
換成<input>
,接著將@bind-Value
改成@bind
,再加入@bind:event
,值為html
的事件名,如onchange
、oninput
等等,這些事件在MDN都可以查到。接著在網頁的輸入框輸入內容,就可以看到底下的字即時變換了,可以看到我的焦點雖然仍在input
元素上,底下的內容已經改變了。
不過oninput
跟onchange
的使用時機最好再拿捏一下,例如如果使用oninput
綁定number
型別的資料,當使用者輸入1.5的瞬間,就會被改為1,這會讓使用者困惑,若用onchange
,則是在使用者移開焦點後才會將1.5改為1。若非得用oninput
的話,可以將綁定資料改為nullable
或是字串,再使用getter
, setter
自己實作邏輯處理不合法字元。
那Blazor有類似Angular的pipe
去改變網頁的資料格式如number、datetime嗎?目前有提供@bind:format
綁定可以改變日期格式,我們先在PostModel
加入一個CreateDateTime
,接著複製一組標題的div
貼上,將label
跟@bind
的綁定資料改一下,再把@bind:event
改成@bind:format
,就可以看到顯示成指定的日期格式。
要注意的是Blazor並沒有對應<select>
的Component,因為HTML的attribute
不能有null
,最接近null
的概念是移除value
這個attribute
,但如果選到一個沒有value
的<option>
,瀏覽器會將該<option>
的文字當成value
。
Ref: ASP.NET Core Blazor data binding
Ref: GlobalEventHandlers.onchange
Ref: Unparsable values